//
// Description: 240. 食物链
// Created by Loading on 2022/7/17.
//

#include <bits/stdc++.h>

using namespace std;

constexpr int N = 50010;

// f 存储每个节点的父节点，d 存储每个节点到父节点的距离（距离 % 3 相同时，即为同类）
int f[N], d[N];

/* 带权并查集 */
int find(int x) {
    if (x != f[x]) {
        int tmp = find(f[x]);
        // 路径压缩时，更新 x 到父节点的距离
        d[x] += d[f[x]];
        f[x] = tmp;
    }

    return f[x];
}

int main() {
    int n, k;
    cin >> n >> k;

    for (int i = 1; i <= n; ++i) {
        f[i] = i;
    }

    int res = 0;
    while (k--) {
        int D, x, y;
        cin >> D >> x >> y;
        if (x > n || y > n) {
            ++res;
        } else {
            int fx = find(x), fy = find(y);
            if (D == 1) {
                // x 和 y 均已加入集合，但到父节点的距离不同，则为假话
                if (fx == fy && (d[x] - d[y]) % 3) {
                    ++res;
                } else if (fx != fy) {
                    // 将 x 和 y 归并成一个集合
                    f[fx] = fy;
                    d[fx] = d[y] - d[x];
                }
            } else {
                // x 和 y 均已加入集合，但到父节点的距离差不为 1，则为假话
                // x 吃 y，则 (d[x] - d[y]) % 3 == 1
                if (fx == fy && (d[x] - d[y] - 1) % 3) {
                    ++res;
                } else if (fx != fy) {
                    // 将 x 和 y 的食物链关系加入集合
                    f[fx] = fy;
                    d[fx] = d[y] + 1 - d[x];
                }
            }
        }
    }

    cout << res << endl;

    return 0;
}